package szoftlab4;

import java.util.ArrayList;

/**
 * Az asztalon elhelyezhető építőelem.
 * @author Peti
 */
public interface Epitoelem {

    /**
     * Visszaadja, hogy ez az építőelem melyik asztalon helyezkedik el.
     *
     * @return
     * Az építőelemet tartalmazó asztal.
     */
    public Asztal getAsztal();

    /**
     * A szabadon maradt, azaz semmilyen kimenethez nem csatlakozó bemenetek listáját adja vissza.
     * @return
     * A szabad bemenetek listája.
     */
    public ArrayList<Bemenet> szabadBemenetek();

    /**
     * A szabadon maradt, azaz semmilyen bemenethez nem csatlakozó kimenetek listáját adja vissza.
     * @return
     * A szabad kimenetek listája.
     */
    public ArrayList<Kimenet> szabadKimenetek();

    /**
     * Az építőelem logikája a kimenet értékének kiszámítására.
     * @throws KritikusVersenyhelyzetException
     */
    public void szamol() throws KritikusVersenyhelyzetException;

    /**
     * Az építőelem átadja saját magát az EpitoelemAktivVisitor visit metódusának.
     *
     * @param v
     * Az asztal EpitoelemAktivVisitora.
     */
    public void accept(EpitoelemAktivVisitor v);

    /**
     * Csatlakozást kezdeményez egy megadott sorszámú bemenetéről egy másik
     * építőelem megadott sorszámú kimenetére.
     *
     * @param bemenetIndexe
     * A megadott bemenet sorszáma.
     *
     * @param cel
     * A másik építőelem.
     *
     * @param kimenetIndexe
     * A másik építőelem megadott kimenetének sorszáma.
     *
     */
    public void csatlakozik(int bemenetIndexe, Epitoelem cel, int kimenetIndexe);

    /**
     * Csatlakozást fogad egy vezeték megadott sorszámú bemenetéről
     * egy megadott sorszámú kimenetére.
     *
     * @param bemenetIndexe
     * A kezdeményező vezeték megadott bemenetének sorszáma.
     *
     * @param innen
     * A kezdeményező vezeték.
     *
     * @param kimenetIndexe
     * A megadott kimenet sorszáma.
     *
     * @return
     * A csatlakozásra kijelölt kimenet.
     *
     */
    public Kimenet csatlakozik(int bemenetIndexe, Vezetek innen, int kimenetIndexe);

    /**
     * Csatlakozást fogad egy nem vezeték típusú építőelem megadott sorszámú
     * bemenetéről egy megadott sorszámú kimenetére.
     *
     * @param bemenetIndexe
     * A kezdeményező építőelem megadott bemenetének sorszáma.
     *
     * @param innen
     * A kezdeményező építőelem.
     *
     * @param kimenetIndexe
     * A megadott kimenet sorszáma.
     *
     * @return
     * A csatlakozásra kijelölt kimenet.
     *
     */
    public Kimenet csatlakozik(int bemenetIndexe, NemVezetekEpitoelem innen, int kimenetIndexe);

}
